package com.leyou.trade.service.impl;

import com.leyou.auth.utils.UserContext;
import com.leyou.trade.entity.Cart;
import com.leyou.trade.repository.CartRepository;
import com.leyou.trade.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private CartRepository cartRepository;

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 添加购物车
     *
     * @param cart 添加购物车的商品信息
     */
    @Override
    public void addCart(Cart cart) {
        /**
         * 用户登录购物车
         */

        // 获取用户ID
        Long userId = UserContext.getUser().getId();
        // 调用方法判断当前的购物车信息是否已经在数据库存在
        Cart newCart = handleUpdateItem(userId, cart);
        // 写入db
        cartRepository.save(newCart);


        /**
         * 用户不登陆购物车
         */
        /*
        // 查询一下是否加入过商品
        Cart storeCart = cartRepository.findBySkuId(cart.getSkuId());

        // 加入过，直接改数量
        if (storeCart != null) {

            cart.setId(storeCart.getId());
            // 存在商品，直接修改数量
            cart.setNum(cart.getNum() + storeCart.getNum());
            cartRepository.save(cart);
        } else {
            // 生成一个随机ID
            cart.setId((Long) Math.round(Math.random()*10000));
            // 没有加入直接加
            cartRepository.save(cart);
        }
        */
    }


    /**
     * 判断当前购物车信息是否已经存在
     * @param userId
     * @param cart
     * @return
     */
    private Cart handleUpdateItem(Long userId, Cart cart) {

        // 根据用户ID生成数据ID
        String id = createId(userId, cart.getSkuId());
        // 查询商品
        Optional<Cart> optional = cartRepository.findById(id);
        // 判断当前用户的数据库中是否有商品
        if (optional.isPresent()) {
            Cart oldCart = optional.get();
            // 直接修改数量
            cart.setNum(oldCart.getNum() + cart.getNum());
        }
        // 补充数据，id、userId、时间
        cart.setId(id);
        cart.setUserId(userId);
        cart.setUpdateTime(new Date());
        return cart;
    }


    /**
     * 生成购物车ID
     *
     * @param userId 用户id
     * @param skuId  商品skuid
     * @return 生成的唯一标识——id
     */
    private String createId(Long userId, Long skuId) {
        return String.format("u%ds%d", userId, skuId);
    }


    /**
     * 查看购物车商品
     *
     * @return 返回查询到的数据库中的数据
     */
    @Override
    public List<Cart> listCarts() {
        // TODO:根据时间排序
//        return cartRepository.findByUserId(Sort.Direction.DESC, "updateTime");
        return cartRepository.findByUserId(UserContext.getUser().getId());
    }


    /**
     * 更新购物车商品数量
     *
     * @param skuId 商品的skuid
     * @param num   加购的数量
     */
    @Override
    public void updateNum(Long skuId, Integer num) {
        // 根据skuid以及用户id生成购物车id
        String id = createId(UserContext.getUser().getId(), skuId);
        // 根据id查找购物车信息
        Optional<Cart> optional = cartRepository.findById(id);
        // 判断是否存在购物车数据
        if (optional.isPresent()) {
            // 存在获取对象
            Cart cart = optional.get();
            // 修改数量
            cart.setNum(num);
            // 保存
            cartRepository.save(cart);
        }
    }

    /**
     * @param skuId
     */
    @Override
    public void deleteBySkuId(Long skuId) {
        // 根据id删除数据库中对应的购物车信息
        cartRepository.deleteById(createId(UserContext.getUser().getId(), skuId));
    }

    /**
     * 合并购物车车
     * @param carts 本地localStorage中存储的购物车数据
     */
    @Override
    public void asnyCarts(List<Cart> carts) {
        // 生成用户id
        Long userId = UserContext.getUser().getId();
        // 判断当前cart对象是否已经存在
        List<Cart> cartList = carts.stream()
                .map(cart -> handleUpdateItem(userId, cart)).collect(Collectors.toList());
        // 批量新增/修改
        cartRepository.saveAll(cartList);
    }

}
